import Vue from "vue"
import "./modules/fetchGuard"
import "./modules/routeGuard"
import {security_const} from "./modules/constant";
import {securityApi} from "./modules/securityApi";
import {securityStore} from "./modules/observable";
import {hasPermission, routeAuthHandler, routerToResourceHandler} from "./modules/common";

let security = {}
security.install = function (Vue) {
  Vue.directive('hasPermission', {
    //指令的钩子函数：
    //  bind：只调用一次，指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
    //  inserted：被绑定元素插入父节点时调用 (仅保证父节点存在，但不一定已被插入文档中)。
    //  update：所在组件的 VNode 更新时调用，但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变，也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
    //  componentUpdated：指令所在组件的 VNode 及其子 VNode 全部更新后调用。
    //  unbind：只调用一次，指令与元素解绑时调用。
    inserted(el, binding) {
      if(!hasPermission(binding.value)){
        el.parentNode.removeChild(el)
      }

    }
  })
  Vue.prototype.$security = {
    constants: security_const,
    states: securityStore,
    common:{
      hasPermission,
      routerToResourceHandler,
      routeAuthHandler
    },
    oauth: {
      ...securityApi,
      async loginAuth(loginData, callback) {
        try{
          let oauthToken = await securityApi.token(loginData);
          securityStore.mutation.changeOauthToken(oauthToken)
          if(oauthToken) {
            let accreditResponse = await securityApi.accredit()
            if (accreditResponse.status == 200) {
              securityStore.mutation.changePermission(accreditResponse.result)
            }
            let authUserResponse= await securityApi.authUser()
            if (authUserResponse.status == 200) {
              securityStore.mutation.changeAuthUser(authUserResponse.result)
            }
          }
          typeof (callback) === 'function' && callback(true)
          return {bool: true}
        }catch (e) {
          console.error(e)
        }
      },
    }
  };
}
Vue.use(security)
export default security

